-- StatusM
-- Create by weism
-- 状态模块

module("StatusM", package.seeall);

-- 所有的状态信息
local rows = {};

-- 状态名称与ID的映射关系
local aliasIdMap = {};

-- 内部函数声明

-- 载入配置表
local _init = false;
local loadCsv = function()
    if _init then return end
    _init = true;

    -- 将所有的状态信息转换下
    local status_CSV = get_status_CSV();
    for i = 1, #status_CSV do
        rows[status_CSV[i].status] = status_CSV[i];
        aliasIdMap[status_CSV[i].alias] = status_CSV[i].status;
    end
    -- TODO: 这里赋值nil不起效，暂不知为何
    status_CSV = {};
end

-- 模块初始化
function init()
    loadCsv();
end

-- 根据状态ID取得别名
function getAlias(id)
    return rows[id].alias;
end

-- 根据别名取得id
function getId(alias)
    return aliasIdMap[alias];
end

-- 取得状态信息
function getRow(id)
    if (type(id) == "number") then
        return rows[id];
    else
        return row[StatusM.getId(id)];
    end
end

-- 更新玩家的状态信息
function update(target, status)
    target.dbase:set("status", status);
end

-- 判断玩家是否有某个状态
function check(target, status)
    local id = status;
    if (type(status) == "string") then
        id = StatusM.getId(status);
    end

    local r = target.dbase:query("status", {});
    return table.indexOf(r, id) ~= -1;
end

-- 删除某个状态
function clear(target, status)
    local id = status;
    if (type(status) == "string") then
        id = StatusM.getId(status);
    end

    local r = target.dbase:query("status", {});
    table.removeItem(r, id);
    target.dbase:set("status", r);
end

-- 附加一个状态
function apply(target, status)
    if check(target, status) then
        return true;
    end

    local id = status;
    if (type(status) == "string") then
        id = StatusM.getId(status);
    end

    local r = target.dbase:query("status", {});
    table.insert(r, id);
    target.dbase:set("status", r);

    return true;
end

-- 取得状态的condition信息
function queryCondition(target, status)
    local id = status;
    if (type(status) == "string") then
        id = StatusM.getId(status);
    end

    local r = target.dbase:query("condition", {});
    return r[id];
end
